package org.ttitfly.workflow.handler.adapter;

import java.lang.reflect.Method;
import java.lang.reflect.TypeVariable;

import org.ttitfly.workflow.handler.Handler;
import org.ttitfly.workflow.handler.ReflectMethodInvoker;


/**
 * 只要用户包含有名字为"handle"的public方法即被支持适配成<code>Handler</code>接口，但重载的handle方法将不被区分。
 * 
 * @author 潘海春
 * @version 2009-9-11
 */
public class HandlerMethodAdapter implements HandlerAdapter {

	/**
	 * 默认的handle方法名，只要拥有方法签名为HANDLER_METHOD_NAME，即可被支持Handler调用
	 */
	private static final String HANDLER_METHOD_NAME = "handle";

	@Override
	public Handler adaptee(Object handler) {
		Method[] methods = handler.getClass().getMethods();
		for (Method method : methods) {
			if (method.getName().equals(HANDLER_METHOD_NAME)) {
				// 获取参数名称
				String[] argNames = new String[0];
				TypeVariable<?>[] tvs = method.getTypeParameters();
				if (tvs != null && tvs.length > 0) {
					argNames = new String[tvs.length];
					int i = 0;
					for (TypeVariable<?> tv : tvs) {
						argNames[i++] = tv.getName();
					}
				}
				return new RefletctMethodHandlerAdapter(new ReflectMethodInvoker(method, handler), argNames);
			}
		}
		return null;
	}

	@Override
	public boolean support(Object handler) {
		Method[] methods = handler.getClass().getMethods();
		for (Method method : methods) {
			if (method.getName().equals(HANDLER_METHOD_NAME)) {
				return true;
			}
		}
		return false;
	}

}
